package util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import sun.misc.PostVMInitHook;

import java.util.Arrays;

/**
 * 拼音工具类
 */
public class PinyinUtil {
    //定义汉语拼音的配置 全局常量，在定义时初始化，全局唯一
    private static final HanyuPinyinOutputFormat FORMAT;

    static{
        //当PinyinUtil类加载时执行静态块，除了产生对象，还可以进行配置相关工作
        FORMAT =new HanyuPinyinOutputFormat();
        //设置转换后的英文字母为全小写  小熊——>xiaoxiong
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        //设置是转换后的英文字母是不带音调
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        //特殊拼音用v代替 绿——>lv
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
    }

    /**
     * 传入任意文件名，就能将该文件名称转为字符串小写全品和首字母小写字符串
     * eg: 小熊真帅——>xiaoxiongzhenshuai
     * 若文件名中包含数字或者其他字符，就直接保留
     * @param fileName
     * @return
     */
    public static String[] getPinyinByFileName(String fileName){
        //结果集里面存放两个字符串
        //第一个字符串为小写全拼，第二个字符串为首字母小写
        String[] ret=new String[2];
        //遍历文件名的每个字符，碰到中文就进行转换
        StringBuilder allnameAppender=new StringBuilder();
        StringBuilder firstCaseAppender=new StringBuilder();
        for (char c :fileName.toCharArray()){
            //不考虑多音字，使用第一个返回值作为我们的参数
            try {
                String[] pinyins= PinyinHelper.toHanyuPinyinStringArray(c,FORMAT);
                if (pinyins==null || pinyins.length==0){
                    //碰到非中文字符保留
                    allnameAppender.append(c);
                    firstCaseAppender.append(c);
                }else{
                    //碰到了中文字符，假如有多音字，就只取第一个作为结果返回值
                    allnameAppender.append(pinyins[0]);
                    firstCaseAppender.append(pinyins[0].charAt(0));
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                allnameAppender.append(c);
                firstCaseAppender.append(c);
            }
        }
        ret[0]=allnameAppender.toString();
        ret[1]=firstCaseAppender.toString();
        return ret;
    }

    public static void main(String[] args) {
//        String str1="中华人民共和国";
//        System.out.println(Arrays.toString(getPinyinByFileName(str1)));
//        String str2="中华12人民共asd和国";
//        System.out.println(Arrays.toString(getPinyinByFileName(str2)));
        String str3="abc";
        String str4="123";
        String str5="123哈";
        System.out.println(containsChinese(str3));
        System.out.println(containsChinese(str4));
        System.out.println(containsChinese(str5));
    }

    //所有中文对应的Unicode编码区间
    private static final String CHINESE_PATTERN ="[\\u4E00-\\u9FA5]";

    /**
     * 判断给定的字符串是否包含中文
     * 字符串在存储时，都是转为单个字符进行存储的，在java中，字符采用Unicode编码
     * 所有的中文都对应一个不同的Unicode编码值，只需要知道多有中文编码的起止区间即可
     * @param str
     * @return
     */
    public static boolean containsChinese(String str) {
        return str.matches(".*"+CHINESE_PATTERN+".*");
    }

}
